package leetcode.hash;

import java.util.LinkedList;

public class SlidingWindow {
    public static int[] maxSlidingWindow(int[] nums, int k) {

        if (nums == null || k < 1 || nums.length < k) {
            return new int[0];
        }
        //声明一个双向队列，用于存放滑动窗口的值，但里面存的值是有要求的
        //首先这个双向队列中存的值是数组中值对应的索引，而不是存值
        //其次这个双向队列一定要是从左到右的索引对应数组中的值一定要是从大到小递减的小的或者相等的情况一定要让其出队列
        LinkedList<Integer> qmax = new LinkedList<Integer>();
        //下面这两个变量用来存放滑动窗口最大值
        int index = 0;
        int res[] = new int[nums.length - k + 1];
        //遍历数组
        for (int i = 0; i < nums.length; i++) {
            //判断当前遍历数组的值是否可以达到入队列的要求，如果队尾的元素比当前元素小
            while (!qmax.isEmpty() && nums[qmax.peekLast()] <= nums[i]) {
                qmax.pollLast();
            }
            //队列尾的元素比当前值大，就可以入队列了
            qmax.addLast(i);
            //判断队列头部索引是否过期，如果过期，就将他从队列中删除
            if (qmax.peekFirst() == i - k) {
                qmax.pollFirst();
            }
            //滑动窗口里面的值被填充满，开始计算滑动窗口中的最大值
            if (i >= k - 1) {
                res[index++] = nums[qmax.peekFirst()];
            }
        }
        return res;
    }
}
